;(function($) {
	var Drag = {
		fdom:null, //父标签
		zdom:[], //所有模块对象
		doms:[], //记录所有模块封装后的对象
		currentdom:null,//当前拖动对象
		lsyddom:null,//当前拖动生成的dom
		dragdoms:[], //记录拖动前集合
		lsyddoms:[], //记录拖动后集合
		ydIndex:-1//记录拖动插入下标
	}
	$.fn.ckDrag = function(ev){
		Drag.fdom = $(this);
		$(this).css("position","relative");
		Drag.zdom = $(this).find(">div");
		Drag.doms = [];
		for (var i = 0; i < Drag.zdom.length; i++) {
			var dom = $(Drag.getDom());
			var zdom = $(Drag.zdom.get(i));
			dom.append(zdom);
			dom.attr("layout",zdom.attr("layoutdom"));
			dom.attr("module-name",zdom.attr("module-name"));
			dom.attr("module-id",i);
			Drag.doms.push(dom);
		};
		Drag.fdom.empty();
		for (var i = 0; i < Drag.doms.length; i++) {
			Drag.fdom.append($(Drag.doms[i]));
		};
		Drag.setDomPosition(Drag.doms);
		return Drag;     
	};
	//获取返回元素
	Drag.getResultDom =function(){
		var mydoms = Drag.fdom.find(">div");
		var resultdom = "";
		for (var i = 0; i < mydoms.length; i++) {
			var name = $(mydoms[i]).attr("module-name");
			resultdom += '<'+name+' selected-modules="activityManager.configure.selectedModules">'+'</'+name+'>';
		};
		return resultdom;
	}
	//拖动事件
	Drag.zdomdragstart = function(ev){
		Drag.isdrop=false;
		var dt = ev.dataTransfer;
		dt.effectAllowed = 'all';
		Drag.currentdom = this;
		//新建个零时辅助定位dom
		var dom = $(Drag.getDom());
		dom.attr("layout",$(this).attr("layoutdom"));
		dom.attr("module-name",$(this).attr("module-name"));
		dom.attr("module-id",$(this).parent().attr("module-id"));
		dom.css("border","2px dashed rgb(79, 195, 0)");
		dom.css("height",($(this).height()+10)+"px");
		Drag.lsyddom = dom;
		//为元素添加接受事件
		dom.get(0).addEventListener("drop",Drag.domsdrop,false);
		//判断当前拖拽模块 在源模块中删除 整合如拖动集合中准备拖动
		var dragid = $(this).parent().attr("module-id");
		Drag.dragdoms = [];
		for (var i = 0; i < Drag.doms.length; i++) {
			if ($(Drag.doms[i]).attr("module-id")!=dragid) {
				Drag.dragdoms.push($(Drag.doms[i]));
			};
		};
	};
	//拖动结束事件
	Drag.zdomdragend = function(ev){
		//拖动结束后重新组合页面
		Drag.fdom.empty();
		for (var i = 0; i < Drag.doms.length; i++) {
			Drag.fdom.append($(Drag.doms[i]));
		};
		Drag.lsyddom.get(0).removeEventListener("drop",Drag.domsdrop,false);
		Drag.lsyddom = null;
		Drag.setDomPosition(Drag.doms);
		Drag.addDragEvent();
		ev.preventDefault();
	};
	Drag.zdomdragover = function(ev){
		var top = ev.y - Drag.fdom.offset().top;
		var left = ev.x - Drag.fdom.offset().left;
		var j=-1;
		for (var i = 0; i < Drag.dragdoms.length; i++) {
			var dtop = parseInt($(Drag.dragdoms[i]).css("top"));
			var dheight = parseInt($(Drag.dragdoms[i]).css("top"))+$(Drag.dragdoms[i]).height();
			var dleft = parseInt($(Drag.dragdoms[i]).css("left"));
			var dwidth = parseInt($(Drag.dragdoms[i]).css("left"))+$(Drag.dragdoms[i]).width();
			var dwidth2 = parseInt($(Drag.dragdoms[i]).css("left"))+$(Drag.dragdoms[i]).width()/2;
			if(top>dtop && top <= dheight && left>dleft){
				if (left<dwidth2) {
					j = i;
					break;
				}else if (left>dwidth2 && left<dwidth) {
					j = i+1;
					break;
				};
			}
		};
		//ydIndex判断是否和之前拖动位置一样 以防止重复重组页面影响效率
		if (j!=-1 && Drag.ydIndex!=j) {
			Drag.ydIndex = j;
			Drag.lsyddoms = [];
			for (var i = 0; i < Drag.dragdoms.length; i++) {
				Drag.lsyddoms.push($(Drag.dragdoms[i]));
			};
			Drag.lsyddoms.splice(j, 0, Drag.lsyddom);
			Drag.fdom.empty();
			for (var i = 0; i < Drag.lsyddoms.length; i++) {
				Drag.fdom.append($(Drag.lsyddoms[i]));
			};
			Drag.setDomPosition(Drag.lsyddoms);
		};
		ev.preventDefault();
	};
	//拖动接受事件
	Drag.domsdrop = function(ev){
		var dt = ev.dataTransfer;
		dt.DragEffect = "link";
		this.appendChild(Drag.currentdom);
		$(this).css("border","none");
		$(this).css("height","auto");
		//利用拖动后的集合重组模块集合
		Drag.doms = [];
		for (var i = 0; i < Drag.lsyddoms.length; i++) {
			var tdom =$(Drag.lsyddoms[i])
			Drag.doms.push(tdom);
		};
		ev.preventDefault();
		ev.stopPropagation();
	}
	
	//为页面元素添加拖拽事件
	Drag.addDragEvent = function(){
		for (var i = 0; i<Drag.zdom.length; i++) {
			Drag.zdom[i].addEventListener("dragstart",Drag.zdomdragstart,false);
			Drag.zdom[i].addEventListener("dragend",Drag.zdomdragend,false);
			Drag.zdom[i].addEventListener("dragover",Drag.zdomdragover,false);
		}
	};
	//设置元素位置
	Drag.setDomPosition = function(doms){
		var qjwidth = Drag.fdom.width();
		var onedom = [];
		var oddom=[];
		var jr = true;
		for (var i = 0; i < doms.length; i++) {
			tdom = $(doms[i])
			var left=0,top=0;
			if(i != 0){
				if(jr){
					oddom = [];
					for (var k = 0; k < onedom.length; k++) {
						oddom.push($(onedom[k]));
					}
					onedom=[];
				}
				var zdom = $(doms[i-1]);
				var wz = parseInt(zdom.css("left"))+zdom.width()+tdom.width();
				// console.log(qjwidth+"ffffffff"+wz);
				if(oddom.length > 0){
					var top = parseInt(zdom.css("top"));
					var width = parseInt(zdom.css("left"));
					var lsdom=$(oddom[0]);
					for (var k = 0; k < oddom.length; k++) {
						if ($(oddom[k]).height() > lsdom.height()){
							lsdom = $(oddom[k]);
						}
					};
					//出现11211或者21111的情况换一行
					if ((parseInt(lsdom.css("left"))+lsdom.width()<width)) {
						if ( (parseInt(lsdom.css("top"))+lsdom.height()+6 > top+zdom.height()) && (parseInt(lsdom.css("left"))+lsdom.width()+18+zdom.width()) > qjwidth){
							jr=true;
						}
					}else{
						if ( (parseInt(lsdom.css("top"))+lsdom.height()+6 > top+zdom.height()) && ((wz+lsdom.width()) > qjwidth)){
							jr=true;
						}
					};
				}
				if (wz>qjwidth) {jr=true;}
				else{jr = false};
				onedom.push(zdom);
				// console.log("oddom"+oddom);
				// console.log("onedom"+onedom);
				// console.log("tdom");
				// console.log(tdom);
				var in1 = parseInt(zdom.attr("layout"));
				if (in1 >= 4) {//最后一个如果是为4 那直接排到其下面
					top = parseInt(zdom.css("top"))+zdom.height();
					left = 0;
				}else if(jr){//如果是确定新的一行确定其top位置
					// console.log("1");
					var lsdom=$(onedom[0]);
					for (var k = 0; k < onedom.length; k++) {
						if (parseInt($(onedom[k]).css("top"))+$(onedom[k]).height() < parseInt(lsdom.css("top"))+lsdom.height()){
							lsdom = $(onedom[k]);
						}
					};
					var olddom=$(oddom[0]);
					for (var k = 0; k < oddom.length; k++) {
						if (parseInt($(oddom[k]).css("top"))+$(oddom[k]).height() > parseInt(olddom.css("top"))+olddom.height()){
							olddom = $(oddom[k]);
						}
					};
					// console.log("lsdom");
					// console.log(lsdom);
					left = parseInt(lsdom.css("left"));
					top = parseInt(lsdom.css("top"))+lsdom.height();
					// console.log("11111"+"left"+left+"top"+top);
					var ifjr=true;
					var dydom=$(onedom[0]);
					// console.log(onedom);
					for (var k = 0; k < onedom.length; k++) {
						var itop = parseInt($(onedom[k]).css("top"))+$(onedom[k]).height();
						var ileft = parseInt($(onedom[k]).css("left"));
						if ( itop > parseInt(top) && ileft < (left+tdom.width()-6) && (ileft+$(onedom[k]).width()) > left){
							top = parseInt($(onedom[k]).css("top"))+$(onedom[k]).height()+3;
							// console.log("=44=");
						}
						if (parseInt($(onedom[k]).css("top"))+$(onedom[k]).height() > parseInt(dydom.css("top"))+dydom.height()){
							dydom = $(onedom[k]);
						}
					};
					// console.log("dydom");
					// console.log(dydom);
					if (parseInt(top)+6> parseInt(dydom.css("top"))+dydom.height() || left+tdom.width() > qjwidth ) {
						// console.log(onedom);
						// console.log((left+tdom.width())+"=55="+qjwidth);
						// console.log(dydom);
						top = parseInt(dydom.css("top")) + dydom.height();
						left = 0;
						jr=true;
					};
					if ( (parseInt(olddom.css("top"))+olddom.height()+6 < parseInt(dydom.css("top"))+dydom.height()) && left+tdom.width() < parseInt(dydom.css("left")) && parseInt(olddom.css("top"))+olddom.height() > parseInt(dydom.css("top"))) {
						top = parseInt(olddom.css("top")) + olddom.height();
						left = 0;
						jr=true;
						// console.log((left+tdom.width())+"=66="+qjwidth);
						
					};
				}else{//如不是上面的情况则说明是在同一行排列确定其top和left
					// console.log("2");
					top = zdom.css("top");
					left = parseInt(zdom.css("left"))+zdom.width();
					if ((left+tdom.width()-18) > qjwidth) {
						left = 0;
						oddom = []
						top = parseInt(zdom.css("top"))+zdom.height();
					}
					var onelsdom=$(onedom[0]);
					for (var k = 0; k < onedom.length; k++) {
						if (parseInt($(onedom[k]).css("top"))+$(onedom[k]).height() > parseInt(onelsdom.css("top"))+onelsdom.height()){
							onelsdom = $(onedom[k]);
						}
					};
					var lsdom=$(oddom[0]);
					for (var k = 0; k < oddom.length; k++) {
						var itop = parseInt($(oddom[k]).css("top"))+$(oddom[k]).height();
						var ileft = parseInt($(oddom[k]).css("left"));
						//出现排列高度不一确定高度
						if ( itop > parseInt(top) && ileft < (left+tdom.width()-6) && (ileft+$(oddom[k]).width()) > left){
							top = parseInt($(oddom[k]).css("top"))+$(oddom[k]).height();
							if (ileft+$(oddom[k]).width()+18 > qjwidth) {
								jr=true;
							};
							// console.log("7777");
						}
						if (parseInt($(oddom[k]).css("top"))+$(oddom[k]).height() > parseInt(lsdom.css("top"))+lsdom.height()){
							lsdom = $(oddom[k]);
						}
					};
					//确定出现12111情况定位最后一个1
					if (parseInt(lsdom.css("left"))!=0 && (parseInt(lsdom.css("left"))+lsdom.width()+tdom.width())<qjwidth && parseInt(zdom.css("top"))+tdom.height()<(parseInt(lsdom.css("top"))+lsdom.height())) {
						top = zdom.css("top");
						left = parseInt(lsdom.css("left"))+lsdom.width();
						// console.log("888");
					};
					if (parseInt(onelsdom.css("top"))+onelsdom.height() < top+6) {
						left = 0;
						jr=true;
						// console.log("999");
					};
				};
			}
			tdom.css("left",left);
			tdom.css("top",top);
		};
		var lsheight=parseInt($(doms[0]).css("top"))+$(doms[0]).height();
		for (var k = 0; k < doms.length; k++) {
			var domheight = parseInt($(doms[k]).css("top"))+$(doms[k]).height();
			if (domheight > lsheight){
				lsheight = domheight;
			}
		};
		Drag.fdom.height(lsheight+20);
	}
	//源Dom结构
	Drag.getDom = function(){
		return '<div class="ck-drag2"></div>';
	};
	document.ondragover = function(e){e.preventDefault();};
	document.ondrag = function(e){e.preventDefault();};
})(jQuery);